package cn.tedu.scalacollection

/**
 * @author Amos
 * @date 2022/5/18
 */

object CollectionHightLevelFunctionTest {
  def main(args: Array[String]): Unit = {
    /*
    （1）过滤（filter）
    遍历一个集合并从中获取满足指定条件的元素组成一个新的集合
    （2）转化/映射（map）
    将集合中的每一个元素映射到某一个函数
    （3）扁平化
    （4）扁平化+映射 注：flatMap 相当于先进行 map 操作，在进行 flatten 操作
    集合中的每个元素的子元素映射到某个函数并返回新集合
    （5）分组(group)
    按照指定的规则对集合的元素进行分组
    （6）简化（归约）
     */

    // (1) 过滤，求偶数
    val list = List(1, 2, 3, 4, 5, 6, 7)
    println(list.filter((x) => {x % 2 == 0}))
    println(list.filter(x => x % 2 == 0))
    println(list.filter(_ % 2 == 0))

    // (2) map,将集合中的每一个元素转换(映射)成新的元素
    println(list.map(x => x * 10))
    println(list.map(_ * 10))

    // (3) 扁平化:flatten
    val list1 = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
    // ::表示元素的拼接，:::表示列表的拼接
    val list2 = list1(0):::list1(1):::list1(2)
    println(list2)
    println(list1.flatten)  // List(1, 2, 3, 4, 5, 6, 7, 8, 9)

    // (4)扁平化+映射：flatMap: 先做map映射，再做扁平化(flatten)处理
    // List("hello", "world", "hello", "scala", "hello" , "flink")
    val list3 = List("hello world", "hello scala", "hello flink")
    println(list3.map(x => x.split(" ").toList).flatten) // List(hello, world, hello, scala, hello, flink)
    println(list3.flatMap(x => x.split(" "))) // 内部是先实现map，再flat。List(hello, world, hello, scala, hello, flink)
    println(list3.flatMap(_.split(" ")))

    // (5) 分组(group)
    // 按照指定的规则对集合的元素进行分组
    val list5 = List("hadoop", "hive", "flink", "flume", "scala", "spark", "hbase")
    println(list5.groupBy(x => x.charAt(0)))
    println(list5.groupBy(_.charAt(0)))  // Map(h -> List(hadoop, hive, hbase), s -> List(scala, spark), f -> List(flink, flume))

    // (6) reduce 规约
    val list6 = List(1, 2, 3, 4, 5)
    println(list6.reduce(_ + _)) // 15 (((1+2)+3)+4)+5
    println(list6.reduce((x,y) => {x+y}))
    println(list6.reduce(_ - _)) // -13 (((1-2)-3)-4)-5
    println(list6.reduceRight(_+_)) // 15
    println(list6.reduceRight(_-_)) // 3    1-(2-(3-(4-5)))

  }


}
